#![allow(dead_code)]
pub struct Solution;

impl Solution {
    pub fn longest_common_prefix(strs: Vec<String>) -> String {
        // NOTE: is_empty() 代替为空，为0
        if strs.is_empty() {
            return "".to_string();
        }

        let mut prefix = strs[0].as_str();
        for str in &strs[1..] {
            prefix = compare_string(prefix, str);
            if prefix.is_empty() {
                return "".to_string();
            }
        }
        return prefix.to_string();

        // NOTE: fn take_while<P>(self, predicate:P)-> TakeWhile<Self,P>
        // where
        // Self: Sized,
        // P: FnMut(&Self::Item) ->bool,
        // 创建一个迭代器，该迭代器根据谓词产生元素。
        // take_while()将闭包为参数，为每个元素调用此闭包，并在true时，产生yield元素。
        // 返回false后，take_while()的工作结束，剩余元素被忽略。
        //
        fn compare_string<'a>(str1: &'a str, str2: &'a str) -> &'a str {
            let len = str1
                .chars()
                .zip(str2.chars())
                .take_while(|&(c1, c2)| c1 == c2)
                .count();
            &str1[..len]
        }
        // 旧代码，notion优化后。对比
        //
        // fn compare_string<'a>(str1: &'a str, str2: &'a str) -> &'a str {
        //     let len = std::cmp::min(str1.len(), str2.len());
        //     let mut index = 0;
        //     for i in 0..len {
        //         if str1.chars().nth(i) == str2.chars().nth(i) {
        //             index += 1;
        //         } else {
        //             let (res, _) = str1.split_at(index);
        //             return res;
        //         }
        //     }
        //     let (res, _) = str1.split_at(index);
        //     res
        // }
    }
}

#[cfg(test)]
mod test_longest_common_prefix {
    use super::Solution;
    #[test]
    fn test_1() {
        assert_eq!(
            Solution::longest_common_prefix(vec![
                "flower".to_string(),
                "flow".to_string(),
                "flight".to_string()
            ]),
            "fl".to_string()
        );
    }

    #[test]
    fn test_2() {
        assert_eq!(
            Solution::longest_common_prefix(vec![
                "dog".to_string(),
                "racecar".to_string(),
                "car".to_string()
            ]),
            "".to_string()
        );
    }
    #[test]
    fn test_3() {
        assert_eq!(
            Solution::longest_common_prefix(vec!["cir".to_string(), "car".to_string(),]),
            "c".to_string()
        );
    }
    #[test]
    fn test_4() {
        assert_eq!(
            Solution::longest_common_prefix(vec!["a".to_string()]),
            "a".to_string()
        );
    }
}

